package queue;

/*Implemente uma fila circular de inteiros usando arrays. 
A interface da fila e os arquivos de teste foram
disponibilzados no site. Implemente a interface e execute os casos de teste	*/

/**
 * Laboratorio de Estrutura de Dados
 * @author talitalm - 20921059
 */

public class QueueImpl implements Queue {

	public static int[] lista;
	int comeco, fim, numElementos;
	private final int TAMANHO_LISTA = 10;

	/**
	 * Construtor
	 */
	public QueueImpl() {
		lista = new int[TAMANHO_LISTA];
		comeco = 0;
		fim = 0;
		numElementos = 0;
	}
	
	// alocar espacos
	@Override
	public void enqueue(int i) throws QueueOverflowException {
		if (full()) {
			throw new QueueOverflowException();
		}
		if (lista.length < fim + 1) {
			fim = 0;
		}
			lista[fim] = i;
			fim++;
			numElementos++;	
	}

	// desalocar espacos
	@Override
	public int dequeue() throws QueueUnderflowException {
		if (isEmpty()) {
			throw new QueueUnderflowException();
		}
		int var = lista[comeco];
		lista[comeco] = 0;
		comeco++;
		if (comeco >= lista.length) {
			comeco = 0;
		}
			numElementos--;
			return var;
		}

	// cabeca da fila
	@Override
	public int head() {
		return comeco;
	}

	// verifica se a fila esta vazia
	@Override
	public boolean isEmpty() {
		if (numElementos == 0)
			return true;
		return false;
	}

	// verifica se a fila esta cheia
	@Override
	public boolean full() {
		if (numElementos == lista.length)
			return true;
		return false;
	}
}
